var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var bodyParser = require('body-parser')
var jwt = require('jsonwebtoken');
var app = express();

// create application/json parser
var jsonParser = bodyParser.json()

// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// 在这里编写代码

// get请求  http://localhost:3000/list

// request： 前端请求  携带了请求路径，请求方式，请求参数
// response: 后端响应
// app.get('/list',(request,response)=>{
//   console.log('收到请求了');
//   response.json({
//     code: 200,
//     msg: '请求成功'
//   })
// })

// 登录

// 假设数据库中的登录的用户名： 13112341234-123456
// 接收前端传递的参数 phone pwd
let phoneValue = 13112341234
let pwdValue = 123456

app.post('/login', jsonParser, (request,response)=>{
  // 获取request传递的数据
  let {phone,password} = request.body
  if (phone == phoneValue && pwdValue == password) {
    // 生成token
    let token = jwt.sign({phone},'snailSxxszxjykj', {
      expiresIn: 60 * 60
    })
    response.json({
      code: 200,
      msg: '登录成功',
      data: {
        token 
      }
    })
  }else{
    response.json({
      code: 400,
      msg: '登录失败'
    })
  }
  
})


app.get('/list', (request,response)=>{
  jwt.verify(request.headers.token, 'snailSxxszxjykj', (err, result)=>{
    console.log(result);
    if (!err){
      response.json({
        code: 200,
        msg: '成功'
      })
    }else{
      response.json({
        code: 401,
        msg: '失败'
      })
    }
  })
  
})

app.post('/upload', (request,response)=>{
  response.json({
    code: 200,
    msg: 'ok'
  })
})

// 200 成功  400 失败   401 token错误 失效  登录过期
// token
// 拦截器 200 通过   400 直接报错
// 所有的请求，先拦截，然后添加上token   继续请求

/**
 * post获取前端的数据
 * 
 * 1、 npm i body-parser --save
 * 2、 引入  var bodyParser = require('body-parser')
 * 3.  var jsonParser = bodyParser.json()  // application/json parser
 * 4.  var urlencodedParser = bodyParser.urlencoded({ extended: false })   application/x-www-form-urlencoded parser
 * 5.  查看前端的content-type
 * 6.  在请求中，配置对应的中间件
 *      app.post('/login', jsonParser, (request,response)=>{
 *        cosnole.log(request.body) // 获取到数据
 *      })
 */

/**
 * token 生成流程
 * 1. npm install jsonwebtoken --save
 * 2. 引入  var jwt = require('jsonwebtoken');
 * 3. 在用户名和密码验证通过后，生成token 
 *      let toekn = jwt.sign() // 接收三个参数  参数一，用户信息  参数二： 秘钥  参数三： 过期时间
 *      let token = jwt.sign({phone},'snailSxxszxjykj')  // 示例代码
 * 4. 将token传递给前端
 *    let token = jwt.sign({phone},'snailSxxszxjykj')
      response.json({
        code: 200,
        msg: '登录成功',
        data: {
          token 
        }
      })
 */

/**
 * token验证
 */




// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
